package com.wzx.common.exception;

import com.wzx.common.constants.StatusCode;
import com.wzx.common.pojo.resp.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

/**
 * 标识该类是一个全局的异常处理类
 *
 * @author wzx
 * @version 1.0
 * @date 2022/1/21 - 17:25
 * @description 统一异常处理类
 */
@Slf4j
@RestControllerAdvice
public class OverAllExceptionHandler  {
    /**
     * implements ResponseBodyAdvice<Object>
     */
    /**
     * 写一个方法 用来专门处理controller抛出的[系统的]异常信息捕获
     *
     * @ExceptionHandler(value=Exception.class) 修饰方法 用来当controller 的异常发生的异常是 value指定的异常的 时候
     * 执行 被他修饰的方法
     */
    @ExceptionHandler(value = Exception.class)
    public Result handlerSystemException(Exception e) {
        log.error("网络异常信息:{}", e.getMessage());
        //为了开发方便，将来要改成：网络异常
        return Result.error(StatusCode.OTHER_ERROR.message(), StatusCode.OTHER_ERROR.code());
    }

    @ExceptionHandler(value = IllegalArgumentException.class)
    public Result handlerIllegalArgumentException(IllegalArgumentException e){
        log.error("参数校验异常:{}", e.getMessage());
        //为了开发方便，将来要改成：网络异常
        return Result.error(e.getMessage(), StatusCode.PARAM_ERROR.code());
    }

    /**
     * 写一个方法 用来专门处理controller抛出的[业务 自定义的异常类的]异常信息捕获
     *
     * @param e 自定义异常类
     * @return
     */
    @ExceptionHandler(value = LeadNewsException.class)
    public Result handlerBusinessException(LeadNewsException e) {
        //e.printStackTrace();//异常打印堆栈
        log.error("自定义异常信息:", e);
        //业务的异常 一定要使用自定义的message
        return Result.error(e.getMessage(), StatusCode.PARAM_ERROR.code());
    }

    @ExceptionHandler(value = NeedCodeException.class)
    public Result handlerNeedCodeException(NeedCodeException e) {
        //e.printStackTrace();//异常打印堆栈
        log.error("自定义异常信息:", e);
        //业务的异常 一定要使用自定义的message
        return Result.error(e.getMessage(), StatusCode.NEED_CODE.code());
    }


    /**
     * 若该方法返回成功，则执行下面的代码
     * 这里主要处理：判断该类或方法上是否有@AutoApiResponse这个注解，若有，则返回统一格式的信息
     *
     * @param returnType
     * @param converterType
     * @return
     */
    /*@Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        *//**
         * returnType.getDeclaringClass() 返回声明基础方法或构造函数的类。
         * AutoApiResponse autoResp = returnType.getDeclaringClass().getAnnotation(AutoApiResponse.class);
         * return autoResp != null;
         * *//*
        *//*AutoApiResponse apiResponse = AnnotationUtils.getAnnotation(Objects.requireNonNull(returnType.getMethod()), AutoApiResponse.class);
        if (apiResponse == null) {
            apiResponse = AnnotationUtils.getAnnotation(returnType.getDeclaringClass(), AutoApiResponse.class);
        }
        if (apiResponse == null) {
            return false;
        }
        return apiResponse.enable();*//*
        return false;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        //最终响应 body为返回的主要信息
        return null;
    }*/
}
